package com.dongzili.common.task.utils;

import org.apache.commons.lang3.StringUtils;

public class CronToChinese {

    /**
     * CRON表达式翻译为中文描述
     * <p>复杂表达式和部分通配符不支持，不处理年(第七段)</p>
     *
     * @param cronStr cron表达式
     * @return 中文描述
     */
    public static String translateToChinese(String cronStr) {
        if (StringUtils.isBlank(cronStr)) {
            throw new IllegalArgumentException("cron表达式为空");
        }

        String[] cronArray = cronStr.split(" ");
        if (cronArray.length != 6 && cronArray.length != 7) {
            throw new IllegalArgumentException("cron表达式格式错误");
        }

        String secondCron = cronArray[0];
        String minuteCron = cronArray[1];
        String hourCron = cronArray[2];
        String dayCron = cronArray[3];
        String monthCron = cronArray[4];
        String weekCron = cronArray[5];

        StringBuilder result = new StringBuilder();

        // 解析月
        if (!monthCron.equals("*") && !monthCron.equals("?")) {
            if (monthCron.contains("/")) {
                result.append("从")
                        .append(monthCron.split("/")[0])
                        .append("月开始,每")
                        .append(monthCron.split("/")[1])
                        .append("个月");
            } else {
                result.append("每年").append(monthCron).append("月");
            }
        }

        // 解析周 - 优化后的处理逻辑
        if (!weekCron.equals("*") && !weekCron.equals("?")) {
            if (weekCron.contains(",")) {
                // 处理多个周几，如"2,4,6"
                String[] days = weekCron.split(",");
                result.append("每周");
                for (String day : days) {
                    result.append(getWeekDayName(day)).append("、");
                }
                result.deleteCharAt(result.length() - 1); // 删除最后一个顿号
            } else if (weekCron.contains("-")) {
                // 处理周范围，如"2-6"
                String[] range = weekCron.split("-");
                result.append("每周")
                        .append(getWeekDayName(range[0]))
                        .append("至")
                        .append(getWeekDayName(range[1]));
            } else {
                // 单个周几
                result.append("每周").append(getWeekDayName(weekCron));
            }
        }

        // 解析日
        if (!dayCron.equals("?") && !"*".equals(dayCron)) {
            if (!weekCron.equals("*") && !weekCron.equals("?")) {
                throw new IllegalArgumentException("表达式错误，不允许同时存在指定日和指定星期");
            }
            if (dayCron.contains("/")) {
                result.append("从第")
                        .append(dayCron.split("/")[0])
                        .append("天开始,每")
                        .append(dayCron.split("/")[1])
                        .append("天");
            } else {
                result.append("每月").append(dayCron).append("日");
            }
        }

        // 解析时间部分（时、分、秒）
        String timeDesc = parseTime(hourCron, minuteCron, secondCron);
        if (!timeDesc.isEmpty()) {
            if (result.length() == 0) {
                if(!hourCron.equals("*")){
                    result.append("每天");
                }else if (!minuteCron.equals("*")){
                    result.append("每小时第");
                }else if (!secondCron.equals("*")){
                    result.append("每分钟第");
                }
            }
            result.append(" ").append(timeDesc);
        }

        if (result.length() > 0) {
            return result.append("执行一次").toString();
        }
        return "表达式中文转换异常";
    }

    /**
     * 解析时间部分（时、分、秒）
     */
    private static String parseTime(String hour, String minute, String second) {
        StringBuilder timeBuilder = new StringBuilder();

        // 解析小时
        if (!hour.equals("*")) {
            if (hour.contains("/")) {
                timeBuilder.append(hour.split("/")[0])
                        .append("点开始,每")
                        .append(hour.split("/")[1])
                        .append("小时");
            } else if (hour.contains(",")) {
                timeBuilder.append(hour.replace(",", "点、"))
                        .append("点");
            } else if (hour.contains("-")) {
                String[] range = hour.split("-");
                timeBuilder.append(range[0])
                        .append("点到")
                        .append(range[1])
                        .append("点");
            } else {
                timeBuilder.append(hour).append("点");
            }
        }

        // 解析分钟
        if (!minute.equals("*") && !minute.equals("0")) {
            if (timeBuilder.length() > 0) {
                timeBuilder.append(" ");
            }
            if (minute.contains("/")) {
                timeBuilder.append("每")
                        .append(minute.split("/")[1])
                        .append("分钟");
            } else if (minute.contains("-")) {
                String[] range = minute.split("-");
                timeBuilder.append(range[0])
                        .append("分到")
                        .append(range[1])
                        .append("分");
            } else {
                timeBuilder.append(minute).append("分");
            }
        }

        // 解析秒
        if (!second.equals("*") && !second.equals("0")) {
            if (timeBuilder.length() > 0) {
                timeBuilder.append(" ");
            }
            if (second.contains("/")) {
                timeBuilder.append("每")
                        .append(second.split("/")[1])
                        .append("秒");
            } else {
                timeBuilder.append(second).append("秒");
            }
        }

        return timeBuilder.toString();
    }

    /**
     * 获取周几的中文名称
     */
    private static String getWeekDayName(String day) {
        switch (day) {
            case "1": return "日";
            case "2": return "一";
            case "3": return "二";
            case "4": return "三";
            case "5": return "四";
            case "6": return "五";
            case "7": return "六";
            case "SUN": return "日";
            case "MON": return "一";
            case "TUE": return "二";
            case "WED": return "三";
            case "THU": return "四";
            case "FRI": return "五";
            case "SAT": return "六";
            default: return day;
        }
    }

    public static void main(String[] args) {
        System.out.println(translateToChinese("0 0 9 ? * 2"));  // 每周一9点执行一次
        System.out.println(translateToChinese("0 0 12 * * 2-6")); // 每周一至五12点执行一次
        System.out.println(translateToChinese("0 30 10 ? * 2,4,6")); // 每周一、三、五10点30分执行一次
        System.out.println(translateToChinese("0 0 8 ? * 3L")); // 每月最后一周的周二8点执行一次
        System.out.println(translateToChinese("0 0 14 ? * 2#3")); // 每月第3周的周一14点执行一次
        System.out.println(translateToChinese("0 */5 * * * ?")); // 每5分钟执行一次
        System.out.println(translateToChinese("0 0 6,14,20 * * ?")); // 每天6点、14点、20点执行一次
        System.out.println(translateToChinese("0 0 12 15 * ?")); // 每月15日12点执行一次
    }
}